最近准备使用Kafka Mirrormaker做两个数据中心的数据同步,以下是一些要点:
- mirrormaker必须提供一个或多个consumer配置,一个producer配置,一个whitelist或一个blacklist(支持java正则表达式)
- 启动多个mirrormaker进程,单个进程启动多个consuemr streams, 可以提高吞吐量和提供容
- mirrormaker部署在destination datacenter,这样如果kafka集群之间发生网络问题,也不至于从src cluster拿到了数据但发不到dest cluster导致数据丢失
- mirrormaker不能防止数据循环发送,即如果使用mm将数据从ClusterA的TopicA复制到ClusterB的TopicA,另一个mm将数据从ClusterB的TopicA复制到ClusterA的TopicA,那么会产生endless loop,mm的负载会急剧上升
mirrormaker的producer和consumer的一些配置的目标是数据不丢失,而不是高性能,它们分别是
- acks=all(kafka consumer默认1), 意味着数据被拷贝到dest cluster的所有replicas之后才响应
- retries=max integer(kafka producer默认0)
- block.on.buffer.full=true(kafka produmer默认false)
- max.in.flight.requests.per.connection=1(kafka producer默认5), 提升该值可以获得更快的速度,同时意味着如果mirrormaker挂掉,将会丢更多的数据
- auto.commit.enable=false(默认true)
- abort.on.send.failure=true(mirrormaker配置)
其他配置:
linger.ms=0(kafka producer默认0), 调高linger.ms会使mirrormaker能够将更多的消息打包发送以提升效率,同时意味着消息的平均延迟上升- 可以给所有需要mm的topics设置优先级,优先级高的topic将获得更低的延迟,并且能在更短的时间内重启,重启之后也能更快的追上拷贝进度